<?php

/**
 * 过滤空格
 * @param $obj
 * @return mixed
 */
function myTrim($obj)
{
    array_walk_recursive($obj,function (&$item) {
        $item = trim($item);
    });
    return $obj;
}

function getMyEnv(string $key) {
    $env = json_decode(file_get_contents(ROOT_PATH . '/env.json'),true);
    return $env[$key];
}

/**
 * 至少包含数字跟字母，可以有符号，但不能有空格
 * @param $password
 * @return false|int
 */
function matchPwd($password)
{
    if (strstr($password, ' ') !== false || strstr($password, '　') !== false) {
        return false;
    }
    return preg_match('/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,20}$/', $password);
}

/**
 * 递归转义
 * @param array $param
 */
function arrayAddslashes(array &$param)
{
    array_walk_recursive($param, function (&$item) {
        is_string($item) && $item = addslashes($item);
    });
}

/**
 * 获取header里面的自定义参数
 * @param string $key
 * @return mixed
 */
function getHeaderParam(string $key)
{
    return $_SERVER['HTTP_' . $key] ?? '';
}

/**
 * 将特殊字符转换为HTML实体
 * 防止XSS攻击
 * @param $data
 * @return mixed
 */
function arrayHtmlspecialchars($data)
{
    array_walk_recursive($data, function (&$item) {
        is_string($item) && $item = htmlspecialchars($item);
    });
    return $data;
}

/**
 * 频率限制
 *
 * @param string $key 唯一的key值
 * @param int $cycle 多少秒
 * @param int $limit 多少次
 * @return bool true-允许访问，false-禁止访问
 */
function accessLimit(string $key, $cycle = 2, $limit = 1): bool
{
    $redis = \App\Support\Redis\RedisManager::getInstance();
    // 为空,不通过
    if (!$key) {
        return false;
    }

    $used = $redis->incr($key);
    if ($used === false) {
        // redis异常时直接通过
        return true;
    }

    if ($used > $limit) {
        $ttl = $redis->ttl($key);
        if ($ttl == -1) {
            $redis->expire($key, $cycle);
        }
        return false;
    }
    if ($used == 1) {
        $redis->expire($key, $cycle);
    }
    return true;
}


/**
 * 获取lock
 * @param string 要获取锁定的key
 * @param int    需要加锁最长时间
 * @return bool true:成功获取锁，可以进行后续操作， false-获取锁失败，终止后续操作
 */
function getLock($sKey, $time = 3): bool
{
    $redis = \App\Support\Redis\RedisManager::getInstance();
    return $redis->set($sKey, time(), ['nx', 'ex' => $time]);
}

/**
 * 释放lock
 * @param string $sKey 要释放的lock在redis中对应的key
 * @return bool
 */
function delLock(string $sKey): bool
{
    $redis = \App\Support\Redis\RedisManager::getInstance();
    $iLoop = 3;
    do {
        $iKeys = $redis->del($sKey);
    } while ((--$iLoop) && !$iKeys);

    return true;
}